
/*
new 是JavaScript中用来创建对象的关键字。它可以通过构造函数来创建一个对象，并将这个对象绑定到构造函数的原型上.

其执行流程如下：
（1）首先创建了一个新的空对象
（2）设置原型，将对象的原型设置为函数的 prototype 对象。
（3）让函数的 this 指向这个对象，执行构造函数的代码（为这个新对象添加属性）
（4）判断函数的返回值类型，如果是值类型，返回创建的对象。如果是引用类型，就返回这个引用类型的对象。
 */
function myNew(constructorFn, ...args) {
    // 函数的原型赋给对象的原型  方式1
    // newObj.__proto__ = constructorFn.prototype;
    // 函数的原型赋给对象的原型  方式2
    // Object.create() 是JavaScript中创建对象的方法之一，它可以创建一个新对象，并将其原型设置为指定的对象。这个新对象可以继承指定对象的属性和方法，也可以自己定义新的属性和方法。
    let newObj = Object.create(constructorFn.prototype);
    // 将函数绑给对象(由对象来执行)
    let result = constructorFn.apply(newObj, args)
    // 如果结果是Object 则返回结果对象/数组与矩阵 否则返回原对象
    return result instanceof Object ? result : newObj
    // return newObj
}
function Animal(name) {
    this.name = name;
}
class A {
    // 有return则会返回return的东西  没有则会打印对象
    // 类的构造函数不在类的原型上 就在类上
    constructor(name) {
        this.name = name
        // return {
        //     zhang : 2
        // }
    }
}
function test(name) {
    return {
        zhang:name
    }
}
let animal = myNew(Animal, 'dog')
let animal2 = myNew(test, 'dog')
console.log(animal);
console.log(animal2)
console.log(new A("dog").name)
console.log(new A("dog"))
